const express = require('express');
const session = require('express-session');
// 引入解析 token 的字符串
const config = require('./utils/config');
const app = express();


const bodyParser = require('body-parser');

// express-session
app.use(session({
    secret: config.jwtSecretKey,
    resave: false,
    saveUninitialized: true
}));

// 导入 cors 中间件
const cors = require('cors')
// 将 cors 注册为全局中间件
app.use(cors({
    origin: ['http://127.0.0.1:8080', 'http://127.0.0.1:8081', 'http://localhost:8081', 'http://localhost:8080', 'http://localhost:9528'],//可设置多个跨域
    credentials: true//允许客户端携带验证信息
}))



// 请求大小限制
const requestLimit = '5120kb';
// 解析表单的中间件
app.use(express.urlencoded({ extended: false, limit: requestLimit }));
app.use(bodyParser.json({ limit: requestLimit }));

// 响应数据的中间件
app.use(require('./utils/respond.js'));

// 解析 token 的中间件
const expressJWT = require('express-jwt');
// 暴露静态资源
app.use(express.static('public'))


// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
// app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))
app.use(expressJWT.expressjwt({ secret: config.jwtSecretKey, algorithms: ["HS256"] }).unless({ path: ['/api/login', '/api/register', '/api/imgUpload', '/api/email/send', , /^\/images\/.*/] }))

// 错误中间件
app.use(function (err, req, res, next) {
    if (req.body.info === 'lin') {
        return next();
    }
    // 捕获身份认证失败的错误
    if (err.name === 'UnauthorizedError') return res.send({ code: 302, message: "未登录" });
    next();
})


// 导入并注路由模块
app.use('/api', require('./router/index'));

const port = process.env.PORT || 3000;

app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});